package org.design.patterns.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkProxyMode {

    // 代理接口，即房东和中介的协议。
    public interface IHouse{
        // 房租
        String getPrice();
        // 是否同意出租
        boolean agree(int price);
    }
    // 目标类，即房东
    public static class HouseMaster implements IHouse{

        @Override
        public String getPrice() {
            return "房东：房租5000元";
        }

        @Override
        public boolean agree(int price) {
            if(price>4500) {
                return true;
            }
            return false;
        }
    }
//

    // 调用方，即租客
    public static void main(String[] args) {
        // 找个有房子的中介
       IHouse houseProxy = (IHouse) Proxy.newProxyInstance(
               JdkProxyMode.class.getClassLoader(), new Class[]{IHouse.class}, new InvocationHandler() {
            HouseMaster master;
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                if("getPrice".equals(method.getName())){
                    System.out.println("中介：开始查找房源");
                    if(master == null){
                        master = new HouseMaster();
                    }
                    System.out.println("中介：介绍房子信息");
                    String price = (String) method.invoke(master);
                    System.out.println(price);
                    return "中介：可以讲价";
                }else if("agree".equals(method.getName())){
                    System.out.println("中介：租客出价4800");
                    boolean agree = (boolean) method.invoke(master,args);
                    return agree;
                }
                return null;
            }
        });
        // 找中介租房子,问问房子的价格
        System.out.println(houseProxy.getPrice());
        // 我出4800，看看房东是否同意。
        System.out.println("房东："+(houseProxy.agree(4800)?"同意":"不同意")+"出租");
    }
}